約 2,913,006 件
https://w.atwiki.jp/sampleisbest/pages/80.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 utf16 アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 文字セット Unicode utf16.c #include tchar.h #include Windows.h #include "resource.h" // 関数プロトタイプ宣言 ATOMMyRegisterClass(HINSTANCE hInstance); BOOLInitInstance(HINSTANCE hInstance, int nCmdShow); LRESULT CALLBACKWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); intOnCommand(HWND hWnd, WPARAM wParam); voidOnFormFont(HWND hWnd); voidOnCreate(HWND hWnd); voidOnXScroll(HWND hWnd, WPARAM wParam, int nBar, LPSCROLLINFO lpsi); voidOnPaint(HWND hWnd); // グローバル変数 TCHARg_atcClassName[] = _T("utf16"); TCHARg_atcWindowName[] = _T("UTF-16"); HINSTANCEg_hInstance; SCROLLINFOg_siHorz; SCROLLINFOg_siVert; LOGFONTg_lf; intg_iUnitSize = 32; //============================================================================== int APIENTRY _tWinMain( HINSTANCEhInstance, HINSTANCEhPrevInstance, LPTSTRlpCmdLine, intnCmdShow) { MSGmsg; HACCELhAccelTable; MyRegisterClass(hInstance); if (InitInstance(hInstance, nCmdShow) == FALSE) { return 0; } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDR_MAINFRAME); while (GetMessage( msg, NULL, 0, 0)) { if (TranslateAccelerator(msg.hwnd, hAccelTable, msg) == 0) { TranslateMessage( msg); DispatchMessage( msg); } } return msg.wParam; } //------------------------------------------------------------------------------ ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXwcex; wcex.cbSize= sizeof (WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc= WndProc; wcex.cbClsExtra= 0; wcex.cbWndExtra= 0; wcex.hInstance= hInstance; wcex.hIcon= LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor= LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName= (LPCTSTR)IDR_MAINFRAME; wcex.lpszClassName= g_atcClassName; wcex.hIconSm= LoadIcon(NULL, IDI_APPLICATION); return RegisterClassEx( wcex); } //------------------------------------------------------------------------------ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWNDhWnd; g_hInstance = hInstance; hWnd = CreateWindowEx( WS_EX_ACCEPTFILES, g_atcClassName, g_atcWindowName, WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, CW_USEDEFAULT, 0, 720, 720, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } //------------------------------------------------------------------------------ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_PAINT OnPaint(hWnd); break; case WM_COMMAND if (OnCommand(hWnd, wParam)) { return DefWindowProc(hWnd, uMsg, wParam, lParam); } break; case WM_HSCROLL OnXScroll(hWnd, wParam, SB_HORZ, g_siHorz); break; case WM_VSCROLL OnXScroll(hWnd, wParam, SB_VERT, g_siVert); break; case WM_CREATE OnCreate(hWnd); break; case WM_DESTROY PostQuitMessage(0); break; default return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } //------------------------------------------------------------------------------ int OnCommand(HWND hWnd, WPARAM wParam) { static struct { UINTuiMsg; intnScrollCode; } a[] = { {WM_HSCROLL, SB_LINEUP},// ID_LEFT {WM_VSCROLL, SB_LINEUP},// ID_UP {WM_HSCROLL, SB_LINEDOWN},// ID_RIGHT {WM_VSCROLL, SB_LINEDOWN},// ID_DOWN {WM_HSCROLL, SB_TOP},// ID_HTOP {WM_VSCROLL, SB_TOP},// ID_VTOP {WM_HSCROLL, SB_BOTTOM},// ID_HBOTTOM {WM_VSCROLL, SB_BOTTOM},// ID_VBOTTOM }; WORDwID; WORDw; wID = LOWORD(wParam); w = wID - ID_LEFT; if (w _countof(a)) { SendMessage(hWnd, a[w].uiMsg, a[w].nScrollCode, (LPARAM)NULL); return 0; } switch (wID) { case ID_APP_EXIT DestroyWindow(hWnd); break; case ID_FORM_FONT OnFormFont(hWnd); break; default return 1; } return 0; } //------------------------------------------------------------------------------ void OnFormFont(HWND hWnd) { CHOOSEFONTcf; ZeroMemory( cf, sizeof cf); cf.lStructSize= sizeof cf; cf.hwndOwner= hWnd; cf.lpLogFont= g_lf; cf.Flags= CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT; cf.nFontType= SCREEN_FONTTYPE; if (ChooseFont( cf) == FALSE) { return; } InvalidateRect(hWnd, NULL, TRUE); } //------------------------------------------------------------------------------ void OnCreate(HWND hWnd) { g_siHorz.cbSize= sizeof (SCROLLINFO); g_siHorz.fMask= SIF_RANGE | SIF_PAGE | SIF_POS; g_siHorz.nMin= 0; g_siHorz.nMax= 15; g_siHorz.nPage= 1; g_siHorz.nPos= 0; g_siVert = g_siHorz; SetScrollInfo(hWnd, SB_HORZ, g_siHorz, FALSE); SetScrollInfo(hWnd, SB_VERT, g_siVert, FALSE); ZeroMemory( g_lf, sizeof g_lf); g_lf.lfHeight = g_iUnitSize; _tcscpy_s(g_lf.lfFaceName, _countof(g_lf.lfFaceName), _T("メイリオ")); } //------------------------------------------------------------------------------ void OnXScroll(HWND hWnd, WPARAM wParam, int nBar, LPSCROLLINFO lpsi) { intiPos; iPos = lpsi- nPos; switch (LOWORD(wParam)) { case SB_LINEUP // 0 case SB_PAGEUP // 2 iPos--; break; case SB_LINEDOWN // 1 case SB_PAGEDOWN // 3 iPos++; break; case SB_THUMBTRACK // 5 iPos = HIWORD(wParam); break; case SB_TOP // 6 iPos = 0; break; case SB_BOTTOM // 7 iPos = 15; break; } iPos = min(iPos, 15); iPos = max(iPos, 0); if (iPos == lpsi- nPos) { return; } lpsi- nPos = iPos; SetScrollInfo(hWnd, nBar, lpsi, TRUE); InvalidateRect(hWnd, NULL, TRUE); } //------------------------------------------------------------------------------ void OnPaint(HWND hWnd) { PAINTSTRUCTps; HDChdc; HFONThFont; HGDIOBJhFontOld; RECTrc; TCHARatcStr[16]; intiPage; intiHigh; intiLow; hdc = BeginPaint(hWnd, ps); // フォント //g_lf.lfHeight = g_iUnitSize; hFont = CreateFontIndirect( g_lf); hFontOld = SelectObject(hdc, hFont); // 見出し iPage = (g_siVert.nPos 4) + g_siHorz.nPos; SetRect( rc, g_iUnitSize, 0, 200, g_iUnitSize); _stprintf_s(atcStr, _countof(atcStr), _T("%02X区"), iPage); DrawText(hdc, atcStr, -1, rc, DT_LEFT); // 下位ヘッダ rc.left= g_iUnitSize * 2; rc.top= g_iUnitSize; rc.bottom= rc.top + g_iUnitSize; for (iLow = 0; iLow 16; iLow++) { rc.right = rc.left + g_iUnitSize; _stprintf_s(atcStr, _countof(atcStr), _T("%02X"), iLow); DrawText(hdc, atcStr, -1, rc, DT_CENTER); rc.left = rc.right; } // 上位ヘッダ rc.left= g_iUnitSize; rc.top= g_iUnitSize * 2; rc.right= rc.left + g_iUnitSize; for (iHigh = 0; iHigh 16; iHigh++) { rc.bottom = rc.top + g_iUnitSize; _stprintf_s(atcStr, _countof(atcStr), _T("%02X"), iHigh 4); DrawText(hdc, atcStr, -1, rc, DT_CENTER); rc.top = rc.bottom; } atcStr[0] = iPage 8; for (iHigh = 0; iHigh 16; iHigh++) { rc.left= g_iUnitSize * 2; rc.top= g_iUnitSize * (2 + iHigh); rc.bottom= rc.top + g_iUnitSize; for (iLow = 0; iLow 16; iLow++) { rc.right = rc.left + g_iUnitSize; DrawText(hdc, atcStr, 1, rc, DT_CENTER); atcStr[0]++; rc.left = rc.right; } } SelectObject(hdc, hFontOld); DeleteObject(hFont); EndPaint(hWnd, ps); } resource.h #define ID_APP_EXIT100 #define ID_FORM_FONT101 #define IDR_MAINFRAME128 #define ID_LEFT129 #define ID_UP130 #define ID_RIGHT131 #define ID_DOWN132 #define ID_HTOP133 #define ID_VTOP134 #define ID_HBOTTOM135 #define ID_VBOTTOM136 utf16.rc // リソーススクリプト #include windows.h #include "resource.h" //------------------------------------------------------------------------------ // メニュー IDR_MAINFRAME MENU BEGIN POPUP "ファイル( F)" BEGIN MENUITEM "アプリケーションの終了( X)", ID_APP_EXIT END POPUP "書式( O)" BEGIN MENUITEM "フォント( F)...\tCtrl+F", ID_FORM_FONT END END //------------------------------------------------------------------------------ // アクセラレータ IDR_MAINFRAME ACCELERATORS BEGIN VK_LEFT,ID_LEFT,VIRTKEY// 0x25 VK_UP,ID_UP,VIRTKEY// 0x26 VK_RIGHT,ID_RIGHT,VIRTKEY// 0x27 VK_DOWN,ID_DOWN,VIRTKEY// 0x28 VK_LEFT,ID_HTOP,VIRTKEY, CONTROL VK_UP,ID_VTOP,VIRTKEY, CONTROL VK_RIGHT,ID_HBOTTOM,VIRTKEY, CONTROL VK_DOWN,ID_VBOTTOM,VIRTKEY, CONTROL "F",ID_FORM_FONT,VIRTKEY, CONTROL END
https://w.atwiki.jp/gamitest2014062703/pages/49.html
基本表記とプラグインの機能についてサンプル 表示例 基本表記とプラグインの機能について big(){文字} 文字のフォントサイズを標準より一回り大きく表示するプラグインです。(小さく表示するプラグイン⇒smallプラグイン) ご利用のブラウザによって表示が多少異なる場合があります。 サンプル big(){テスト} テスト サンプルでは、「テスト」の文字を標準より一回り大きく表示させてみます。(比較のために下に通常のフォントサイズの「テスト」を表記しています。) 表示例 テスト テスト
https://w.atwiki.jp/japanesehiphop/pages/4937.html
Format Title Artist Label Model Number Release Press 7 ソノサキハ BIG-RE-MAN MONKEY REBEL,JAZZY SPORT MORIOKA MRV-002 2019/11/27 - Side Track Title Produce A 1 ソノサキハ feat.MACKA-CHIN PONZ THE FAMILY RICE B 2 ソノサキハ(Inst) PONZ THE FAMILY RICE PERTAIN RECORD HMV Big-Re-Man/ソノサキハ PERTAIN CD AMAZON 世界平和
https://w.atwiki.jp/sampleisbest/pages/265.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 コンソール アプリケーション プロジェクト名 MidiChord アプリケーションの種類 コンソール アプリケーション 追加のオプション 空のプロジェクト 文字セット Unicode MidiChord.cpp #pragma comment(lib, "winmm") #include Windows.h #include vector #include map using namespace std; typedef vector DWORD VSMSG; typedef multimap DWORD, VSMSG SEQ; // status #define NOTE_OFF0x8 #define NOTE_ON0x9 #define PROGRAM_CHANGE0xc // program #define ACOUSTIC_PIANO0x00 // note number #define G3 55 #define C4 60 #define D4 62 #define E4 64 #define G4 67 #define B4 71 #define C5 72 #define MAKESMSG(st,ch,d1,d2) ((st) 4|(ch)|(d1) 8|(d2) 16) #define MAKESMSG_(d1,d2) ((d1)|(d2) 8) #define CH 0 // 関数プロトタイプ宣言 void SeqInsert(DWORD ticks, DWORD smsg); void SeqInsert(DWORD ticks, DWORD smsg1, DWORD smsg2, DWORD smsg3, DWORD smsg4); // 外部変数 SEQ seq; //============================================================================== int main() { HMIDIOUT hmo; DWORD ticks = 0; int vel = 0x70; SeqInsert(ticks, MAKESMSG(PROGRAM_CHANGE, CH, ACOUSTIC_PIANO, 0)); SeqInsert(ticks, MAKESMSG(NOTE_ON, CH, C4, vel), MAKESMSG_(E4, vel), MAKESMSG_(G4, vel), MAKESMSG_(C5, vel)); ticks += 1500; SeqInsert(ticks - 1, MAKESMSG(NOTE_OFF, CH, C4, 0), MAKESMSG_(E4, 0), MAKESMSG_(G4, 0), MAKESMSG_(C5, 0)); SeqInsert(ticks, MAKESMSG(NOTE_ON, CH, G3, vel), MAKESMSG_(D4, vel), MAKESMSG_(G4, vel), MAKESMSG_(B4, vel)); ticks += 1500; SeqInsert(ticks - 1, MAKESMSG(NOTE_OFF, CH, G3, 0), MAKESMSG_(D4, 0), MAKESMSG_(G4, 0), MAKESMSG_(B4, 0)); SeqInsert(ticks, MAKESMSG(NOTE_ON, CH, C4, vel), MAKESMSG_(E4, vel), MAKESMSG_(G4, vel), MAKESMSG_(C5, vel)); ticks += 1500; SeqInsert(ticks - 1, MAKESMSG(NOTE_OFF, CH, C4, 0), MAKESMSG_(E4, 0), MAKESMSG_(G4, 0), MAKESMSG_(C5, 0)); // play midiOutOpen( hmo, MIDI_MAPPER, NULL, 0, CALLBACK_NULL); DWORD start = timeGetTime(); for (SEQ iterator it = seq.begin(); it != seq.end(); it++) { while (timeGetTime() - start (*it).first) Sleep(1); for (size_t i = 0; i (*it).second.size(); i++) { midiOutShortMsg(hmo, (*it).second[i]); } } midiOutReset(hmo); midiOutClose(hmo); return 0; } void SeqInsert(DWORD ticks, DWORD smsg) { VSMSG vsmsg; vsmsg.push_back(smsg); seq.insert(SEQ value_type(ticks, vsmsg)); } void SeqInsert(DWORD ticks, DWORD smsg1, DWORD smsg2, DWORD smsg3, DWORD smsg4) { VSMSG vsmsg; vsmsg.push_back(smsg1); vsmsg.push_back(smsg2); vsmsg.push_back(smsg3); vsmsg.push_back(smsg4); seq.insert(SEQ value_type(ticks, vsmsg)); }
https://w.atwiki.jp/sampleisbest/pages/277.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 Fourier アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 文字セット Unicode 参考 フーリエ級数展開 Fourier.cpp // Fourier フーリエ級数展開 #define _USE_MATH_DEFINES #include Windows.h #include tchar.h #include math.h #include vector using namespace std; #define APP_NAMETEXT("Fourier") #define YMAX4 // 関数プロトタイプ宣言 void Trace(LPCTSTR format, ...); LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnSize(HWND hWnd, WPARAM wParam, LPARAM lParam); void OnPaint(HWND hWnd); void DrawLine(HDC hdc, RECT rc, vector double f, COLORREF color); // 外部変数 vector double fs;// f(t) source vector double fd;// f(t) destination //============================================================================== int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { // ウィンドウクラスの登録 WNDCLASSEX wcx; ZeroMemory( wcx, sizeof wcx); wcx.cbSize= sizeof wcx; wcx.style= CS_HREDRAW | CS_VREDRAW; wcx.lpfnWndProc= WndProc; wcx.hInstance= hInstance; wcx.hCursor= LoadCursor(NULL, IDC_ARROW); wcx.hbrBackground= (HBRUSH)(COLOR_WINDOW + 1); wcx.lpszClassName= APP_NAME; if (RegisterClassEx( wcx) == 0) { return 0; } // ウィンドウの作成 HWND hWnd = CreateWindow( APP_NAME, APP_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { return 0; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // メッセージループ MSG msg; while (GetMessage( msg, NULL, 0, 0)) { TranslateMessage( msg); DispatchMessage( msg); } return msg.wParam; } void Trace(LPCTSTR format, ...) { va_list arg_ptr; TCHAR buffer[256]; int size; va_start(arg_ptr, format); size = _vsntprintf_s(buffer, _countof(buffer), _TRUNCATE, format, arg_ptr); va_end(arg_ptr); OutputDebugString(buffer); if (size 0) { OutputDebugString(_T("...\n")); } } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_PAINT OnPaint(hWnd); return 0; case WM_SIZE OnSize(hWnd, wParam, lParam); return 0; case WM_DESTROY PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } void OnSize(HWND hWnd, WPARAM wParam, LPARAM lParam) { WORD width = LOWORD(lParam); WORD height = HIWORD(lParam); Trace(_T("OnSize %u %u %u\n"), wParam, width, height); if (wParam == SIZE_MINIMIZED) return; // f(t) source fs.clear(); for (int x = 0; x = width; x++) { double t = (2.0 * x / width - 1) * M_PI; //int y = x width / 2 ? -1 1; fs.push_back(t); } // a0 double sum = 0; for (int x = 0; x width; x++) { sum += fs[x]; } double a0 = sum * (2 * M_PI / width) / (2 * M_PI); Trace(_T("a0=%f\n"), a0); fd.clear(); for (int x = 0; x = width; x++) { fd.push_back(a0); } // an, bn for (int n = 1; n = 15; n++) { double an = 0; double bn = 0; for (int x = 0; x width; x++) { double t = (2.0 * x / width - 1) * M_PI; an += fs[x] * cos(n * t); bn += fs[x] * sin(n * t); } an = an * (2 * M_PI / width) / M_PI; bn = bn * (2 * M_PI / width) / M_PI; Trace(_T("n=%d an=%f bn=%f\n"), n, an, bn); for (int x = 0; x = width; x++) { double t = (2.0 * x / width - 1) * M_PI; fd[x] += an * cos(n * t) + bn * sin(n * t); } } } void OnPaint(HWND hWnd) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, ps); RECT rc; GetClientRect(hWnd, rc); Trace(_T("OnPaint %d %d %d %d\n"), rc.left, rc.top, rc.right, rc.bottom); // 軸 MoveToEx(hdc, 0, rc.bottom / 2, NULL); LineTo(hdc, rc.right, rc.bottom / 2); MoveToEx(hdc, rc.right / 2, 0, NULL); LineTo(hdc, rc.right / 2, rc.bottom); // f(t) DrawLine(hdc, rc, fs, RGB(0,0,255)); DrawLine(hdc, rc, fd, RGB(255,0,0)); EndPaint(hWnd, ps); } void DrawLine(HDC hdc, RECT rc, vector double f, COLORREF color) { HPEN pen = CreatePen(PS_SOLID, 0, color); HGDIOBJ penOld = SelectObject(hdc, pen); MoveToEx(hdc, 0, int(rc.bottom * (YMAX - f[0]) / (YMAX * 2)), NULL); for (int x = 1; x = rc.right; x++) { LineTo(hdc, x, int(rc.bottom * (YMAX - f[x]) / (YMAX * 2))); } penOld = SelectObject(hdc, penOld); DeleteObject(pen); }
https://w.atwiki.jp/sampleisbest/pages/592.html
開発環境 Microsoft Visual Studio Community 2019 実行環境 Microsoft Windows 10 Home (64bit) プロジェクト テンプレート C++ 空のプロジェクト プロジェクト名 dx11domino dx11domino.cpp #pragma comment(lib, "d3d11") #pragma comment(lib, "d3dcompiler") #include Windows.h #include wrl.h #include d3d11.h #include d3dcompiler.h #include DirectXMath.h #define HLSL_FILE L"dx11domino.fx" #define NUM 500 #define STEP 4 #define CYCLE (NUM * STEP) using namespace Microsoft WRL; using namespace DirectX; struct ConstantBuffer { XMMATRIX mView; XMMATRIX mProjection; float frame; float cycle; float f2, f3;// filler }; struct InstanceBuffer { XMFLOAT4 domino; }; struct Head { float x, y, z; float dir; float delta; }; // 外部変数 ComPtr ID3D11Device g_pDevice; ComPtr ID3D11DeviceContext g_pContext; ComPtr IDXGISwapChain g_pSwapChain; ComPtr ID3D11RenderTargetView g_pRenderTargetView; ComPtr ID3D11VertexShader g_pVertexShader; ComPtr ID3D11PixelShader g_pPixelShader; ComPtr ID3D11InputLayout g_pInstanceLayout; ComPtr ID3D11Buffer g_pInstanceBuffer; ComPtr ID3D11Buffer g_pConstantBuffer; ComPtr ID3D11Texture2D g_pDepthBuffer; ComPtr ID3D11DepthStencilView g_pDepthView; InstanceBuffer g_ib[NUM]; XMFLOAT4 g_rail[CYCLE]; Head g_head; XMFLOAT3 g_cam = { 0, 20, 0 }; int g_frame = 0; // 関数宣言 HWND InitWindow(HINSTANCE hInst); HRESULT InitDevice(HWND hWnd); void CleanupDevice(); LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void Render(); void CreateRail(); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int nCmdShow) { HWND hWnd = InitWindow(hInstance); if (!hWnd) return -1; if (FAILED(InitDevice(hWnd))) { CleanupDevice(); return -1; } for (int i = 0; i CYCLE; i++) { CreateRail(); } ShowWindow(hWnd, nCmdShow); MSG msg = { 0 }; while (msg.message != WM_QUIT) { if (PeekMessage( msg, nullptr, 0, 0, PM_REMOVE)) { TranslateMessage( msg); DispatchMessage( msg); } else { Render(); } } CleanupDevice(); return int(msg.wParam); } HWND InitWindow(HINSTANCE hInst) { WNDCLASSEX wc = { sizeof WNDCLASSEX }; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.hInstance = hInst; wc.hCursor = LoadCursor(nullptr, IDC_ARROW); wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1); wc.lpszClassName = L"dx11domino"; if (!RegisterClassEx( wc)) return nullptr; DWORD dwStyle = WS_OVERLAPPEDWINDOW; RECT rc = { 0, 0, 640, 400 }; AdjustWindowRect( rc, dwStyle, FALSE); HWND hWnd = CreateWindow( wc.lpszClassName, L"dx11domino", dwStyle, CW_USEDEFAULT, 0, rc.right - rc.left, rc.bottom - rc.top, nullptr, nullptr, hInst, nullptr); return hWnd; } HRESULT CompileShaderFromFile( LPCWSTR szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut) { DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS; ComPtr ID3DBlob pErrorBlob; HRESULT hr = D3DCompileFromFile(szFileName, nullptr, nullptr, szEntryPoint, szShaderModel, dwShaderFlags, 0, ppBlobOut, pErrorBlob); if (FAILED(hr)) { if (pErrorBlob) { OutputDebugStringA((LPCSTR)pErrorBlob- GetBufferPointer()); } return hr; } return S_OK; } HRESULT InitDevice(HWND hWnd) { HRESULT hr; RECT rc; GetClientRect(hWnd, rc); UINT width = rc.right - rc.left; UINT height = rc.bottom - rc.top; DXGI_SWAP_CHAIN_DESC sd = { 0 }; sd.BufferDesc.Width = width; sd.BufferDesc.Height = height; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;// 符号なし正規化整数 sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.BufferCount = 1; sd.OutputWindow = hWnd; sd.Windowed = TRUE; sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; D3D_FEATURE_LEVEL featureLevel; hr = D3D11CreateDeviceAndSwapChain( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, sd, g_pSwapChain, g_pDevice, featureLevel, g_pContext); if (FAILED(hr)) return hr; // レンダーターゲットビュー ComPtr ID3D11Texture2D pBackBuffer; hr = g_pSwapChain- GetBuffer(0, IID_PPV_ARGS( pBackBuffer)); if (FAILED(hr)) return hr; hr = g_pDevice- CreateRenderTargetView( pBackBuffer.Get(), nullptr, g_pRenderTargetView); if (FAILED(hr)) return hr; // 深度バッファ D3D11_TEXTURE2D_DESC td = { 0 }; td.Width = width; td.Height = height; td.MipLevels = 1; td.ArraySize = 1; td.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; td.SampleDesc.Count = 1; td.SampleDesc.Quality = 0; td.Usage = D3D11_USAGE_DEFAULT; td.BindFlags = D3D11_BIND_DEPTH_STENCIL; hr = g_pDevice- CreateTexture2D( td, nullptr, g_pDepthBuffer); if (FAILED(hr)) return hr; // 深度ビュー D3D11_DEPTH_STENCIL_VIEW_DESC dsv = { td.Format, D3D11_DSV_DIMENSION_TEXTURE2D }; g_pDevice- CreateDepthStencilView(g_pDepthBuffer.Get(), dsv, g_pDepthView); if (FAILED(hr)) return hr; // ビューポート D3D11_VIEWPORT vp = { 0 }; vp.Width = (FLOAT)width; vp.Height = (FLOAT)height; vp.MinDepth = 0; vp.MaxDepth = 1; g_pContext- RSSetViewports(1, vp); // 頂点シェーダ ComPtr ID3DBlob pVSBlob; hr = CompileShaderFromFile(HLSL_FILE, "VS", "vs_5_0", pVSBlob); if (FAILED(hr)) { return hr; } hr = g_pDevice- CreateVertexShader( pVSBlob- GetBufferPointer(), pVSBlob- GetBufferSize(), nullptr, g_pVertexShader); if (FAILED(hr)) return hr; // ピクセルシェーダ ComPtr ID3DBlob pPSBlob; hr = CompileShaderFromFile(HLSL_FILE, "PS", "ps_5_0", pPSBlob); if (FAILED(hr)) { return hr; } hr = g_pDevice- CreatePixelShader( pPSBlob- GetBufferPointer(), pPSBlob- GetBufferSize(), nullptr, g_pPixelShader); if (FAILED(hr)) return hr; // 入力レイアウト D3D11_INPUT_ELEMENT_DESC layout[] = { { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, }; hr = g_pDevice- CreateInputLayout(layout, ARRAYSIZE(layout), pVSBlob- GetBufferPointer(), pVSBlob- GetBufferSize(), g_pInstanceLayout); if (FAILED(hr)) return hr; g_pContext- IASetInputLayout(g_pInstanceLayout.Get()); // インスタンスバッファ D3D11_BUFFER_DESC ib = { 0 }; ib.ByteWidth = (sizeof InstanceBuffer) * NUM; ib.Usage = D3D11_USAGE_DEFAULT; ib.BindFlags = D3D11_BIND_VERTEX_BUFFER; hr = g_pDevice- CreateBuffer( ib, nullptr, g_pInstanceBuffer); if (FAILED(hr)) return hr; UINT stride = sizeof InstanceBuffer; UINT offset = 0; g_pContext- IASetVertexBuffers( 0, 1, g_pInstanceBuffer.GetAddressOf(), stride, offset); // 定数バッファ D3D11_BUFFER_DESC cb = { 0 }; cb.ByteWidth = sizeof ConstantBuffer; cb.Usage = D3D11_USAGE_DEFAULT; cb.BindFlags = D3D11_BIND_CONSTANT_BUFFER; hr = g_pDevice- CreateBuffer( cb, nullptr, g_pConstantBuffer); if (FAILED(hr)) return hr; // g_pContext- VSSetShader(g_pVertexShader.Get(), nullptr, 0); g_pContext- VSSetConstantBuffers(0, 1, g_pConstantBuffer.GetAddressOf()); g_pContext- PSSetShader(g_pPixelShader.Get(), nullptr, 0); return S_OK; } void CleanupDevice() { if (g_pContext) { g_pContext- ClearState(); } } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; switch (uMsg) { case WM_PAINT hdc = BeginPaint(hWnd, ps); EndPaint(hWnd, ps); break; case WM_DESTROY PostQuitMessage(0); break; default return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } void Render() { XMFLOAT4 target = g_rail[(g_frame + CYCLE / 2) % CYCLE]; float dx = g_cam.x - target.x; float dz = g_cam.z - target.z; float dist1 = sqrtf(dx * dx + dz * dz); float dist2 = fminf(fmaxf(dist1, 20), 100); if (dist1 != dist2) { float rad = atan2f(dx, dz); g_cam.x = target.x + sinf(rad) * dist2; g_cam.z = target.z + cosf(rad) * dist2; } // g_pContext- OMSetRenderTargets( 1, g_pRenderTargetView.GetAddressOf(), g_pDepthView.Get()); float ClearColor[4] = { 0, 0, 0, 1 }; g_pContext- ClearRenderTargetView(g_pRenderTargetView.Get(), ClearColor); g_pContext- ClearDepthStencilView(g_pDepthView.Get(), D3D11_CLEAR_DEPTH, 1, 0); XMFLOAT3 up(0, 1, 0); ConstantBuffer cb; cb.mView = XMMatrixLookAtLH( XMLoadFloat3( g_cam), XMLoadFloat4( target), XMLoadFloat3( up)); cb.mProjection = XMMatrixPerspectiveFovLH( XMConvertToRadians(15), 640.0f / 400.0f, 1, 500); cb.frame = float(g_frame); cb.cycle = CYCLE; g_pContext- UpdateSubresource(g_pConstantBuffer.Get(), 0, nullptr, cb, 0, 0); g_pContext- UpdateSubresource(g_pInstanceBuffer.Get(), 0, nullptr, g_ib, 0, 0); g_pContext- IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); g_pContext- DrawInstanced(18, NUM, 0, 0); g_pSwapChain- Present(1, 0); // CreateRail(); } void CreateRail() { if (g_frame % 32 == 0) { g_head.delta = float(rand() % 4 - 1); } float dist = 0.75; float rad = XMConvertToRadians(g_head.dir); float s, c; XMScalarSinCos( s, c, rad); g_head.x += s * dist; g_head.z += c * dist; g_head.dir += g_head.delta; int f = g_frame % CYCLE; g_rail[f] = { g_head.x, 0, g_head.z, rad }; if (g_frame % STEP == 0) { int id = f / STEP; g_ib[id].domino = g_rail[f]; } g_frame++; } dx11domino.fx cbuffer ConstantBuffer register(b0) { matrix View; matrix Projection; float frame; float cycle; }; struct VS_INPUT { float4 domino TEXCOORD; uint vid SV_VertexID; uint iid SV_InstanceID; }; struct PS_INPUT { float4 Pos SV_Position; float4 Coord TEXCOORD; }; matrix rotationX(float angle) { float c = cos(angle); float s = sin(angle); return matrix( 1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1); } matrix rotationY(float angle) { float c = cos(angle); float s = sin(angle); return matrix( c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1); } matrix translation(float3 t) { return matrix( 1, 0, 0, t.x, 0, 1, 0, t.y, 0, 0, 1, t.z, 0, 0, 0, 1); } static uint vertices[] = { 3,1,2,0, 0,4,2,6,3,7,1,5,0,4, 4,5,6,7 }; // Vertex Shader PS_INPUT VS(VS_INPUT input) { PS_INPUT output = (PS_INPUT)0; uint vtx = vertices[input.vid]; float3 coord = float3(vtx 1, (vtx 1) 1, (vtx 2) 1); float3 pos = (coord - 0.5) * float3(2, 4, 1); float iframe = floor(frame / cycle) * cycle + float(input.iid) * 4.0; if (iframe frame) { iframe += cycle; } float f = iframe - frame; float a = clamp((cycle / 2.0 - f) * 7.5, 0.0, 70.0); matrix world = mul(rotationY(input.domino.w), rotationX(radians(a))); world = mul(translation(input.domino.xyz), world); matrix mvp = mul(mul(Projection, View), world); output.Pos = mul(mvp, float4(pos, 1)); output.Coord = float4(coord, 1); return output; } // Pixel Shader float4 PS(PS_INPUT input) SV_Target { float3 edge = step(0.48, abs(input.Coord.xyz - 0.5)); if (length(edge) 1.0) { return float4(0.5, 0.5, 0.5, 1); } return input.Coord; }
https://w.atwiki.jp/sampleisbest/pages/273.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 コンソール アプリケーション プロジェクト名 wavelen アプリケーションの種類 コンソール アプリケーション 追加のオプション 空のプロジェクト wavelen.cpp // 自己相関による波長解析 #define _USE_MATH_DEFINES #include stdio.h #include math.h typedef unsigned char BYTE; #define DATA_NUM1000 #define WAVE_LEN75.0 int main() { BYTE waveformData[DATA_NUM]; for (int i = 0; i DATA_NUM; i++) { double t = fmod(i / WAVE_LEN, 1.0); double y = t 0.5 ? t * 2 (t - 1) * 2; //double y = sin(2 * M_PI * t); waveformData[i] = BYTE(128 + 64 * y); } for (int pos = 0; pos = DATA_NUM - 200 * 2; ) { double r = -1; int waveLen; for (int wl = 12; wl = 200; wl++) { double sum = 0; for (int i = 0; i wl; i++) { sum +=((waveformData[pos + i] - 128.0) / 128) * ((waveformData[pos + wl + i] - 128.0) / 128); } sum /= wl; // 倍音もほぼ同値になるので基音が選ばれやすいよう何らかのバイアスが必要 //printf("%3d %.3f\n", wl, sum); if (r sum) { r = sum; waveLen = wl; } } printf("%d %d\n", pos, waveLen); pos += waveLen; } return 0; }
https://w.atwiki.jp/sampleisbest/pages/68.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 PortChecker アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 文字セット Unicode PortChecker.iniの例 [General] file=D \etc\morse params=-l200 "トラ" PortChecker.cpp // インポート ライブラリ #pragma comment(lib, "ws2_32.lib") #include tchar.h #include WinSock2.h #include Windows.h #include CommCtrl.h #include "resource.h" #define SAFE_FREE(p)if (p) { free((void*)p); p = NULL; } #define SEC_GEN_T("General") // 関数プロトタイプ宣言 int GetIniFileName(void); INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnInitDialog(HWND hDlg); void OnDestroy(HWND hDlg); void WriteIniFileInt(TCHAR* ptcSec, TCHAR* ptcKey, int iValue); void OnTimer(HWND hDlg); void OnOK(HWND hDlg); void StopTimer(HWND hDlg); void EnableCtrl(HWND hDlg, BOOL bEnable); int CheckPort(void); // グローバル変数 TCHARg_atcIniFile[_MAX_PATH] = _T(""); HWNDg_hProgress; HWNDg_hLabel; HBRUSHg_hBrush; UINTg_uiIDEvent = 0; charg_acHost[256]; intg_iPort; intg_iInterval; intg_iTimer; LPCTSTR lpFile = NULL; LPCTSTR lpParams = NULL; //============================================================================== int APIENTRY _tWinMain( HINSTANCEhInstance, HINSTANCEhPrevInstance, LPTSTRlpCmdLine, intnCmdShow) { WSADATAwsaData; intiRet; // WinSockDLLの初期化 iRet = WSAStartup(MAKEWORD(2, 2), wsaData); if (iRet != 0) { return 0; } if (GetIniFileName()) { return 0; } DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_DIALOG), NULL, DialogProc); WSACleanup(); return 0; } //------------------------------------------------------------------------------ int GetIniFileName(void) { TCHARatcPath[_MAX_PATH]; TCHARatcDrive[_MAX_DRIVE]; TCHARatcDir[_MAX_DIR]; TCHARatcFName[_MAX_FNAME]; TCHARatcExt[_MAX_EXT]; if (GetModuleFileName(NULL, atcPath, _countof(atcPath)) == 0) { return -1; } if (_tsplitpath_s(atcPath, atcDrive, atcDir, atcFName, atcExt) != 0) { return -1; } if (_tmakepath_s(g_atcIniFile, atcDrive, atcDir, atcFName, _T("ini")) != 0) { return -1; } return 0; } //------------------------------------------------------------------------------ INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTRiRetVal = TRUE;// メッセージを処理した switch (uMsg) { case WM_TIMER OnTimer(hDlg); break; case WM_CTLCOLORSTATIC iRetVal = FALSE; if ((HWND)lParam == g_hLabel) { iRetVal = (INT_PTR)g_hBrush; } break; case WM_COMMAND switch (LOWORD(wParam)) { case IDOK OnOK(hDlg); break; case IDCANCEL // タイマー停止 StopTimer(hDlg); break; } break; case WM_INITDIALOG OnInitDialog(hDlg); SetFocus(GetDlgItem(hDlg, IDOK)); iRetVal = FALSE;// SetFocusでフォーカスを設定した場合はFALSE break; case WM_CLOSE // タイマー停止 StopTimer(hDlg); EndDialog(hDlg, 0); break; case WM_DESTROY OnDestroy(hDlg); break; default iRetVal = FALSE;// メッセージを処理しなかった } return iRetVal; } //------------------------------------------------------------------------------ void OnInitDialog(HWND hDlg) { TCHARatcStr[256]; intiX; intiY; iX = GetPrivateProfileInt(SEC_GEN, _T("iX"), 0, g_atcIniFile); iY = GetPrivateProfileInt(SEC_GEN, _T("iY"), 0, g_atcIniFile); SetWindowPos(hDlg, HWND_TOP, iX, iY, 0, 0, SWP_NOSIZE); GetPrivateProfileString(SEC_GEN, _T("url"), _T(""), atcStr, _countof(atcStr), g_atcIniFile); SetDlgItemText(hDlg, IDC_EDIT_URL, atcStr); g_iInterval = GetPrivateProfileInt(SEC_GEN, _T("iInterval"), 0, g_atcIniFile); _stprintf_s(atcStr, _T("%d"), g_iInterval); SetDlgItemText(hDlg, IDC_EDIT_INTERVAL, atcStr); GetPrivateProfileString(SEC_GEN, _T("file"), _T(""), atcStr, _countof(atcStr), g_atcIniFile); lpFile = _tcsdup(atcStr); GetPrivateProfileString(SEC_GEN, _T("params"), _T(""), atcStr, _countof(atcStr), g_atcIniFile); lpParams = _tcsdup(atcStr); g_hProgress = GetDlgItem(hDlg, IDC_PROGRESS); g_hLabel = GetDlgItem(hDlg, IDC_LABEL); g_hBrush = CreateSolidBrush(RGB(0xFF,0x00,0x00)); ShowWindow(g_hLabel, SW_HIDE); } //------------------------------------------------------------------------------ void OnDestroy(HWND hDlg) { RECTrc; TCHARatcStr[256]; GetWindowRect(hDlg, rc); WriteIniFileInt(SEC_GEN, _T("iX"), rc.left); WriteIniFileInt(SEC_GEN, _T("iY"), rc.top); GetDlgItemText(hDlg, IDC_EDIT_URL, atcStr, _countof(atcStr)); WritePrivateProfileString(SEC_GEN, _T("url"), atcStr, g_atcIniFile); WriteIniFileInt(SEC_GEN, _T("iInterval"), g_iInterval); SAFE_FREE(lpFile); SAFE_FREE(lpParams); DeleteObject(g_hBrush); } //------------------------------------------------------------------------------ void WriteIniFileInt(TCHAR* ptcSec, TCHAR* ptcKey, int iValue) { TCHARatcBuf[16]; _stprintf_s(atcBuf, _T("%d"), iValue); WritePrivateProfileString(ptcSec, ptcKey, atcBuf, g_atcIniFile); } //------------------------------------------------------------------------------ void OnTimer(HWND hDlg) { intiRet; // タイマーを1減らす g_iTimer--; SendMessage(g_hProgress, PBM_SETPOS, g_iTimer, 0); ShowWindow(g_hLabel, (g_iTimer 1) ? SW_SHOWNA SW_HIDE); if (0 g_iTimer) { return; } // タイマーが0になったら処理を行う iRet = CheckPort(); if (iRet 0) { StopTimer(hDlg); MessageBox(hDlg, _T("IPアドレスの取得に失敗しました"), NULL, MB_OK); return; } if (0 iRet) { StopTimer(hDlg); ShellExecute(hDlg, NULL, lpFile, lpParams, NULL, SW_SHOWNORMAL); MessageBox(hDlg, _T("サーバーへの接続に成功しました"), _T("通知"), MB_OK); return; } g_iTimer = g_iInterval; //SendMessage(g_hProgress, PBM_SETPOS, g_iTimer, 0); } //------------------------------------------------------------------------------ void OnOK(HWND hDlg) { TCHARatcStr[256]; TCHAR*ptcHost; TCHAR*ptcPort; TCHAR*ptc; size_tsize; // インターバル秒数の取得 GetDlgItemText(hDlg, IDC_EDIT_INTERVAL, atcStr, _countof(atcStr)); g_iInterval = _tstoi(atcStr); // URL GetDlgItemText(hDlg, IDC_EDIT_URL, atcStr, _countof(atcStr)); // ホスト ptc = _tcsstr(atcStr, _T(" //")); if (ptc == NULL) { ptcHost = atcStr; } else { ptcHost = ptc + 3; ptc[2] = _T( \0 ); } // ポート ptc = _tcspbrk(ptcHost, _T(" ")); if (ptc == NULL) { MessageBox(hDlg, _T("ポート番号がありません"), NULL, MB_OK); return; } else { ptc[0] = _T( \0 ); ptcPort = ptc + 1; } wcstombs_s( size, g_acHost, ptcHost, 256); g_iPort = _tstoi(ptcPort); // コントロール無効化 EnableCtrl(hDlg, FALSE); // タイマー発行 g_uiIDEvent = SetTimer(hDlg, 1, 1000, NULL); g_iTimer = 1; SendMessage(g_hProgress, PBM_SETRANGE, 0, MAKELPARAM(0, g_iInterval)); SendMessage(g_hProgress, PBM_SETPOS, g_iTimer, 0); } //------------------------------------------------------------------------------ // タイマー停止 void StopTimer(HWND hDlg) { if (g_uiIDEvent != 0) { KillTimer(hDlg, g_uiIDEvent); g_uiIDEvent = 0; } SendMessage(g_hProgress, PBM_SETPOS, 0, 0); ShowWindow(g_hLabel, SW_HIDE); // コントロール有効化 EnableCtrl(hDlg, TRUE); } void EnableCtrl(HWND hDlg, BOOL bEnable) { EnableWindow(GetDlgItem(hDlg, IDC_EDIT_URL), bEnable); EnableWindow(GetDlgItem(hDlg, IDC_EDIT_INTERVAL), bEnable); EnableWindow(GetDlgItem(hDlg, IDOK), bEnable); } //------------------------------------------------------------------------------ int CheckPort(void) { HOSTENT*phe; SOCKADDR_INname; SOCKETsock = INVALID_SOCKET; intiFlgConnect = 0; intiRet; // IPアドレスの取得 phe = gethostbyname(g_acHost); if (phe == NULL) { return -1; } // サーバーに接続 sock = socket(AF_INET, SOCK_STREAM, 0); name.sin_family= AF_INET; name.sin_port= htons(g_iPort); name.sin_addr= *((IN_ADDR*)phe- h_addr); iRet = connect(sock, (SOCKADDR*) name, sizeof name); if (iRet != 0) { goto Exit; } iFlgConnect = 1; Exit if (iFlgConnect) { shutdown(sock, SD_BOTH); } if (sock != INVALID_SOCKET) { closesocket(sock); } return iFlgConnect; } resource.h #define IDD_MAIN_DIALOG100 #define IDC_STATIC-1 #define IDC_EDIT_URL1000 #define IDC_EDIT_INTERVAL1001 #define IDC_PROGRESS1002 #define IDC_LABEL1003 PortChecker.rc // リソーススクリプト #include windows.h #include "resource.h" IDD_MAIN_DIALOG DIALOGEX 0, 0, 240, 100 STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX EXSTYLE WS_EX_APPWINDOW CAPTION "Port Checker" FONT 9, "MS Pゴシック" BEGIN LTEXT"URL( U) ",IDC_STATIC,8,8,32,12 EDITTEXTIDC_EDIT_URL,40,8,192,12,ES_AUTOHSCROLL LTEXT"間隔( I) ",IDC_STATIC,8,28,32,12 EDITTEXTIDC_EDIT_INTERVAL,40,28,24,12 LTEXT"秒",IDC_STATIC,68,28,12,12 LTEXT"http //host port\nhost port",IDC_STATIC,100,24,100,24 CONTROL"",IDC_PROGRESS,"msctls_progress32",WS_BORDER,8,48,224,12 LTEXT"",IDC_LABEL,8,68,32,12 DEFPUSHBUTTON"開始( S)",IDOK,132,76,48,16 PUSHBUTTON"中止( C)",IDCANCEL,184,76,48,16 END
https://w.atwiki.jp/sampleisbest/pages/60.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 コンソール アプリケーション プロジェクト名 dumpgif アプリケーションの種類 コンソール アプリケーション 追加のオプション 空のプロジェクト 参考 GIFフォーマットの詳細 http //www.tohoho-web.com/wwwgif.htm 時雨エノキオプト-アセンブリホール2nd-自作ソフト-GIFデコーダ http //www.geocities.jp/warotarock/asen2ndgif001.html GIF89a Specification http //www.w3.org/Graphics/GIF/spec-gif89a.txt LZW and GIF explained http //www.martinreddy.net/gfx/2d/GIF-comp.txt dumpgif.c #include fcntl.h // _O_WTEXT #include io.h // _setmode #include stdio.h // _fileno #include tchar.h // TCHAR #include Windows.h #define dprintf(fmt, var) _tprintf(_T(#var)_T("=[")fmt##_T("]\n"), var) #pragma pack(push, 1) typedef struct { BYTErgbtRed; BYTErgbtGreen; BYTErgbtBlue; } SRGBTriple; typedef struct { characSignature[3]; characVersion[3]; USHORTusLogicalScreenWidth; USHORTusLogicalScreenHeight; struct { UCHARSizeofGlobalColorTable 3;// 00000??? UCHARSortFlag 1;// 0000?000 UCHARColorResolution 3;// 0???0000 UCHARGlobalColorTableFlag 1;// ?0000000 } ucbf;// BitField UCHARucBackgroundColorIndex; UCHARucPixelAspectRatio; } SGIFHeader; typedef struct { USHORTusImageLeftPosition; USHORTusImageTopPosition; USHORTusImageWidth; USHORTusImageHeight; struct { UCHARSizeofLocalColorTable 3; UCHARReserved 2; UCHARSortFlag 1; UCHARInterlaceFlag 1; UCHARLocalColorTableFlag 1; } ucbf; } SImageBlock; typedef struct { UCHARucBlockSize; struct { UCHARTransparentColorFlag 1; UCHARUserInputFlag 1; UCHARDisposalMethod 3; UCHARReserved 3; } ucbf; USHORTusDelayTime; UCHARucTransparentColorIndex; UCHARucBlockTerminator; } SGraphicControlExtension; typedef struct { UCHARucBlockSize; characApplicationIdentifier[8]; characApplicationAuthenticationCode[3]; } SApplicationExtension; #pragma pack(pop) // グローバル変数 static FILE*g_pFile;// ファイルポインタ static UCHAR*g_pucImageData;// 画像データ static intg_iImageData;// 画像データのサイズ static intg_iImageIndex;// 画像データの指標 static intg_aiDicTable[0x1000];// 辞書テーブル static intg_iDicIndex;// 辞書テーブルの指標 static UCHAR*g_pucCodeData;// コード化データ static intg_iCodeData;// コード化データのサイズ static intg_iCodeIndex;// コード化データの指標 static UCHARg_ucLZWMinimumCodeSize;// 最小コードビット数 static intg_iClearCode;// クリアコード static intg_iEoICode;// 終了コード static intg_iCodeSize;// コードのビット数 // 関数プロトタイプ宣言 void FileRead(void* pvBuffer, size_t sizeCount); int HexDump(UCHAR* pucBuf, int iBuf); int ParseBlockData(void); int ParseColorTable(int iNum); int ParseGIFHeader(void); int ParseGraphicControlExtension(void); int ParseCommentExtension(void); int ParseApplicationExtension(void); int ParseImageBlock(void); int ParseImageData(void); int LZWDecode(void); int FetchCodeData(int iCodeSize); int AddImageData(int iCode); int AddDicTable(void); int _tmain(int argc, TCHAR* argv[]) { TCHAR*ptcFile;// ファイル名 UCHARucLabel;// ラベル intiStatus;// 状態 _setmode(_fileno(stdout), _O_WTEXT); _setmode(_fileno(stderr), _O_WTEXT); if (argc != 2) { _ftprintf(stderr, _T("usage dumpgif file\n")); return 1; } ptcFile = argv[1]; // ファイルのオープン if (_tfopen_s( g_pFile, ptcFile, _T("rb")) != 0) { _ftprintf(stderr, _T("error _tfopen_s[%s]\n"), ptcFile); return 1; } // GIF Header iStatus = ParseGIFHeader(); // Block while (iStatus == 0) { FileRead( ucLabel, 1); _tprintf(_T("\n*** Block[%#x]\n"), ucLabel); switch (ucLabel) { case 0x2C // Image Block iStatus = ParseImageBlock(); break; case 0x21 // Extension Introducer FileRead( ucLabel, 1); _tprintf(_T("Extension[%#x]\n"), ucLabel); switch (ucLabel) { case 0xF9 // Graphic Control Extension iStatus = ParseGraphicControlExtension(); break; case 0xFE // Comment Extension iStatus = ParseCommentExtension(); break; //case 0x01 // Plain Text Extension //; case 0xFF // Application Extension iStatus = ParseApplicationExtension(); break; default iStatus = -1; } break; case 0x3B // Trailer _tprintf(_T("Trailer\n")); iStatus = 1; break; default iStatus = -1; } } fclose(g_pFile); return 0; } void FileRead(void* pvBuffer, size_t sizeCount) { if (fread(pvBuffer, 1, sizeCount, g_pFile) != sizeCount) { _ftprintf(stderr, _T("error fread\n")); exit(1); } } int HexDump(UCHAR* pucBuf, int iBuf) { inti; for (i = 0; i iBuf; i++) { if (i % 16 == 0) { _tprintf(_T("%.8x "), i); } _tprintf(_T("%.2x%c"), pucBuf[i], _T(" - - - \n")[i % 16]); } if (i % 16) { _tprintf(_T("\n")); } return 0; } int ParseBlockData(void) { UCHARucBlockSize; UCHARaucDataValues[255]; for (;;) { FileRead( ucBlockSize, 1); _tprintf(_T("Block Data[%u]\n"), ucBlockSize); if (ucBlockSize == 0) { break; } FileRead(aucDataValues, ucBlockSize); HexDump(aucDataValues, ucBlockSize); } return 0; } int ParseColorTable(int iNum) { SRGBTriplesct;// ColorTable inti; for (i = 0; i iNum; i++) { FileRead( sct, 3); _tprintf(_T("%.2x%.2x%.2x%.2x%c"), i, sct.rgbtRed, sct.rgbtGreen, sct.rgbtBlue, " \n"[i % 8]); } return 0; } int ParseGIFHeader(void) { SGIFHeadersgifh; intiNumGCT; _tprintf(_T("*** GIF Header\n")); FileRead( sgifh, 13); if (strncmp(sgifh.acSignature, "GIF", 3) != 0) { return -1; } dprintf(_T("%.3S"), sgifh.acSignature); dprintf(_T("%.3S"), sgifh.acVersion); dprintf(_T("%u"), sgifh.usLogicalScreenWidth); dprintf(_T("%u"), sgifh.usLogicalScreenHeight); dprintf(_T("%u"), sgifh.ucbf.GlobalColorTableFlag); dprintf(_T("%u"), sgifh.ucbf.ColorResolution); dprintf(_T("%u"), sgifh.ucbf.SortFlag); dprintf(_T("%u"), sgifh.ucbf.SizeofGlobalColorTable); dprintf(_T("%u"), sgifh.ucBackgroundColorIndex); dprintf(_T("%u"), sgifh.ucPixelAspectRatio); iNumGCT = 0; if (sgifh.ucbf.GlobalColorTableFlag) { iNumGCT = 2 sgifh.ucbf.SizeofGlobalColorTable; } _tprintf(_T("Global Color Table[%d]\n"), iNumGCT); ParseColorTable(iNumGCT); return 0; } int ParseGraphicControlExtension(void) { SGraphicControlExtension sgce; _tprintf(_T("Graphic Control Extension\n")); FileRead( sgce, 6); dprintf(_T("%u"), sgce.ucBlockSize); dprintf(_T("%u"), sgce.ucbf.Reserved); dprintf(_T("%u"), sgce.ucbf.DisposalMethod); dprintf(_T("%u"), sgce.ucbf.UserInputFlag); dprintf(_T("%u"), sgce.ucbf.TransparentColorFlag); dprintf(_T("%u"), sgce.usDelayTime); dprintf(_T("%u"), sgce.ucTransparentColorIndex); dprintf(_T("%#x"), sgce.ucBlockTerminator); return 0; } int ParseCommentExtension(void) { _tprintf(_T("Comment Extension\n")); return ParseBlockData(); } int ParseApplicationExtension(void) { SApplicationExtension sae; _tprintf(_T("Application Extension\n")); FileRead( sae, 12); dprintf(_T("%u"), sae.ucBlockSize); dprintf(_T("%.8S"), sae.acApplicationIdentifier); dprintf(_T("%.3S"), sae.acApplicationAuthenticationCode); return ParseBlockData(); } int ParseImageBlock(void) { SImageBlocksib; intiNumLCT; _tprintf(_T("Image Block\n")); FileRead( sib, 9); dprintf(_T("%u"), sib.usImageLeftPosition); dprintf(_T("%u"), sib.usImageTopPosition); dprintf(_T("%u"), sib.usImageWidth); dprintf(_T("%u"), sib.usImageHeight); dprintf(_T("%u"), sib.ucbf.LocalColorTableFlag); dprintf(_T("%u"), sib.ucbf.InterlaceFlag); dprintf(_T("%u"), sib.ucbf.SortFlag); dprintf(_T("%u"), sib.ucbf.Reserved); dprintf(_T("%u"), sib.ucbf.SizeofLocalColorTable); iNumLCT = 0; if (sib.ucbf.LocalColorTableFlag) { iNumLCT = 2 sib.ucbf.SizeofLocalColorTable; } _tprintf(_T("Local Color Table[%d]\n"), iNumLCT); ParseColorTable(iNumLCT); FileRead( g_ucLZWMinimumCodeSize, 1); dprintf(_T("%u"), g_ucLZWMinimumCodeSize); g_iClearCode= 1 g_ucLZWMinimumCodeSize; g_iEoICode= g_iClearCode + 1; g_iCodeSize= g_ucLZWMinimumCodeSize + 1; g_iImageData = sib.usImageWidth * sib.usImageHeight; g_pucImageData = (UCHAR*)malloc(g_iImageData); if (g_pucImageData == NULL) { _ftprintf(stderr, _T("error malloc\n")); return -1; } g_iImageIndex = 0; FetchCodeData(0); ParseImageData(); HexDump(g_pucImageData, g_iImageData); free(g_pucImageData); return 0; } int ParseImageData(void) { UCHARucBlockSize; UCHARaucDataValues[255]; g_pucCodeData = aucDataValues; for (;;) { FileRead( ucBlockSize, 1); _tprintf(_T("Block Data[%u]\n"), ucBlockSize); if (ucBlockSize == 0) { break; } FileRead(aucDataValues, ucBlockSize); HexDump(aucDataValues, ucBlockSize); g_iCodeData= ucBlockSize; g_iCodeIndex= 0; LZWDecode(); } return 0; } int LZWDecode(void) { intiCode; while (1) { iCode = FetchCodeData(g_iCodeSize); if (iCode 0) { return 1; } if (iCode == g_iClearCode) { // 辞書テーブルのクリア g_iDicIndex = g_iClearCode + 1; g_aiDicTable[g_iDicIndex] = g_iImageIndex; g_iCodeSize = g_ucLZWMinimumCodeSize + 1; continue; } if (iCode == g_iEoICode) { break; } if (g_iDicIndex iCode) { fprintf(stderr, "error StringTable %u %d\n", g_iDicIndex, iCode); return -1; } AddImageData(iCode); AddDicTable(); if ((1 g_iCodeSize) = g_iDicIndex) { g_iCodeSize++; } } return 0; } // コードの取得 // 戻り値:-1=失敗 0以上=コード int FetchCodeData(int iCodeSize) { static UINTuiBits; static intiBits; intiCode; if (iCodeSize = 0) { uiBits= 0; iBits= 0; return -1; } while (iBits iCodeSize) { if (g_iCodeData = g_iCodeIndex) { return -1; } uiBits |= g_pucCodeData[g_iCodeIndex++] iBits; iBits += 8; } iCode = uiBits ((1 iCodeSize) - 1); uiBits = iCodeSize; iBits -= iCodeSize; return iCode; } // 画像データの追加 int AddImageData(int iCode) { intiEnd; inti; if (iCode g_iClearCode) { if (g_iImageData = g_iImageIndex) { return -1; } g_pucImageData[g_iImageIndex++] = iCode; return 0; } iEnd = g_aiDicTable[iCode]; for (i = g_aiDicTable[iCode - 1]; i = iEnd; i++) { if (g_iImageData = g_iImageIndex) { return -1; } g_pucImageData[g_iImageIndex++] = g_pucImageData[i]; } return 0; } // 辞書テーブルの追加 int AddDicTable(void) { if (_countof(g_aiDicTable) = ++g_iDicIndex) { return -1; } g_aiDicTable[g_iDicIndex] = g_iImageIndex; return 0; } 出力 *** GIF Header sgifh.acSignature=[GIF] sgifh.acVersion=[89a] sgifh.usLogicalScreenWidth=[16] sgifh.usLogicalScreenHeight=[16] sgifh.ucbf.GlobalColorTableFlag=[1] sgifh.ucbf.ColorResolution=[7] sgifh.ucbf.SortFlag=[0] sgifh.ucbf.SizeofGlobalColorTable=[7] sgifh.ucBackgroundColorIndex=[0] sgifh.ucPixelAspectRatio=[0] Global Color Table[256] 00000000 01800000 02008000 03808000 04000080 05800080 06008080 07808080 08c0c0c0 09ff0000 0a00ff00 0bffff00 0c0000ff 0dff00ff 0e00ffff 0fffffff 10000000 11000000 12000000 13000000 14000000 15000000 16000000 17000000 18000000 19000000 1a000000 1b000000 1c000000 1d000000 1e000000 1f000000 20000000 21000000 22000000 23000000 24000000 25000000 26000000 27000000 28000000 29000033 2a000066 2b000099 2c0000cc 2d0000ff 2e003300 2f003333 30003366 31003399 320033cc 330033ff 34006600 35006633 36006666 37006699 380066cc 390066ff 3a009900 3b009933 3c009966 3d009999 3e0099cc 3f0099ff 4000cc00 4100cc33 4200cc66 4300cc99 4400cccc 4500ccff 4600ff00 4700ff33 4800ff66 4900ff99 4a00ffcc 4b00ffff 4c330000 4d330033 4e330066 4f330099 503300cc 513300ff 52333300 53333333 54333366 55333399 563333cc 573333ff 58336600 59336633 5a336666 5b336699 5c3366cc 5d3366ff 5e339900 5f339933 60339966 61339999 623399cc 633399ff 6433cc00 6533cc33 6633cc66 6733cc99 6833cccc 6933ccff 6a33ff00 6b33ff33 6c33ff66 6d33ff99 6e33ffcc 6f33ffff 70660000 71660033 72660066 73660099 746600cc 756600ff 76663300 77663333 78663366 79663399 7a6633cc 7b6633ff 7c666600 7d666633 7e666666 7f666699 806666cc 816666ff 82669900 83669933 84669966 85669999 866699cc 876699ff 8866cc00 8966cc33 8a66cc66 8b66cc99 8c66cccc 8d66ccff 8e66ff00 8f66ff33 9066ff66 9166ff99 9266ffcc 9366ffff 94990000 95990033 96990066 97990099 989900cc 999900ff 9a993300 9b993333 9c993366 9d993399 9e9933cc 9f9933ff a0996600 a1996633 a2996666 a3996699 a49966cc a59966ff a6999900 a7999933 a8999966 a9999999 aa9999cc ab9999ff ac99cc00 ad99cc33 ae99cc66 af99cc99 b099cccc b199ccff b299ff00 b399ff33 b499ff66 b599ff99 b699ffcc b799ffff b8cc0000 b9cc0033 bacc0066 bbcc0099 bccc00cc bdcc00ff becc3300 bfcc3333 c0cc3366 c1cc3399 c2cc33cc c3cc33ff c4cc6600 c5cc6633 c6cc6666 c7cc6699 c8cc66cc c9cc66ff cacc9900 cbcc9933 cccc9966 cdcc9999 cecc99cc cfcc99ff d0cccc00 d1cccc33 d2cccc66 d3cccc99 d4cccccc d5ccccff d6ccff00 d7ccff33 d8ccff66 d9ccff99 daccffcc dbccffff dcff0000 ddff0033 deff0066 dfff0099 e0ff00cc e1ff00ff e2ff3300 e3ff3333 e4ff3366 e5ff3399 e6ff33cc e7ff33ff e8ff6600 e9ff6633 eaff6666 ebff6699 ecff66cc edff66ff eeff9900 efff9933 f0ff9966 f1ff9999 f2ff99cc f3ff99ff f4ffcc00 f5ffcc33 f6ffcc66 f7ffcc99 f8ffcccc f9ffccff faffff00 fbffff33 fcffff66 fdffff99 feffffcc ffffffff *** Block[0x2c] Image Block sib.usImageLeftPosition=[0] sib.usImageTopPosition=[0] sib.usImageWidth=[16] sib.usImageHeight=[16] sib.ucbf.LocalColorTableFlag=[0] sib.ucbf.InterlaceFlag=[0] sib.ucbf.SortFlag=[0] sib.ucbf.Reserved=[0] sib.ucbf.SizeofLocalColorTable=[0] Local Color Table[0] g_ucLZWMinimumCodeSize=[8] Block Data[71] 00000000 00 99 09 1c-c8 0c 11 c1-83 88 12 2a-5c a8 10 e1 00000010 40 83 02 21-22 64 d8 f0-60 c1 87 18-1f 52 dc 28 00000020 d1 a1 45 82-1d 33 46 a4-58 90 e4 45-83 12 51 5e 00000030 1c 59 b1 64-4b 95 29 4f-b2 5c e8 92-a6 48 90 1f 00000040 43 46 fc c8-f3 60 40 Block Data[0] 00000000 cc cc cc cc-cc cc cc 88-cc cc cc cc-cc cc cc cc 00000010 cc 88 88 88-88 88 88 88-88 88 88 88-88 88 cc cc 00000020 cc cc cc 88-cc cc cc 88-cc cc cc 88-cc cc cc cc 00000030 cc cc cc 88-88 88 88 88-88 88 88 88-cc cc cc cc 00000040 cc cc cc 88-cc cc cc 88-cc cc cc 88-cc cc cc cc 00000050 88 88 88 88-88 88 88 88-88 88 88 88-88 88 88 cc 00000060 cc cc cc cc-cc cc cc 88-cc cc cc cc-cc cc cc cc 00000070 cc cc cc 88-cc cc cc cc-cc cc cc 88-cc cc cc cc 00000080 88 88 88 88-88 88 88 cc-88 88 88 88-88 88 88 cc 00000090 cc 88 cc 88-cc 88 cc cc-cc 88 cc 88-cc 88 cc cc 000000a0 cc 88 88 88-88 88 cc cc-cc 88 88 88-88 88 cc cc 000000b0 cc 88 cc 88-cc 88 cc cc-cc 88 cc 88-cc 88 cc cc 000000c0 88 88 88 88-88 88 88 cc-88 88 88 88-88 88 88 cc 000000d0 cc cc cc 88-cc cc cc cc-cc cc cc 88-cc cc cc cc 000000e0 cc cc cc 88-cc cc cc cc-cc cc cc 88-cc cc cc cc 000000f0 cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc *** Block[0x3b] Trailer
https://w.atwiki.jp/sampleisbest/pages/112.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 OleDraw アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 参考 OLE描画 / ビューオブジェクト OleDraw.cpp #include Windows.h #include MsHTML.h // 定数定義 static const TCHAR CLASS_NAME[] = TEXT("OleDraw"); static const TCHAR WINDOW_NAME[] = TEXT("OleDraw"); // 関数プロトタイプ宣言 LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL GetObjectFromFile(LPWSTR lpszFilePath, IOleObject **ppOleObject); void DPtoHIMETRIC(LPSIZEL lpSizel); //============================================================================== int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcx; HWND hWnd; MSG msg; // ウィンドウクラスの登録 wcx.cbSize= sizeof (WNDCLASSEX); wcx.style= CS_HREDRAW | CS_VREDRAW; wcx.lpfnWndProc= WindowProc; wcx.cbClsExtra= 0; wcx.cbWndExtra= 0; wcx.hInstance= hInstance; wcx.hIcon= NULL; wcx.hCursor= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wcx.hbrBackground= (HBRUSH)(COLOR_WINDOW + 1); wcx.lpszMenuName= NULL; wcx.lpszClassName= CLASS_NAME; wcx.hIconSm= NULL; if (RegisterClassEx( wcx) == 0) { return 0; } // ウィンドウの作成 hWnd = CreateWindow( CLASS_NAME, WINDOW_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { return 0; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // メッセージループ while (GetMessage( msg, NULL, 0, 0)) { TranslateMessage( msg); DispatchMessage( msg); } return msg.wParam; } //------------------------------------------------------------------------------ LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static IOleObject *pOleObject = NULL; switch (uMsg) { case WM_CREATE CoInitializeEx(NULL, COINIT_MULTITHREADED); GetObjectFromFile(L"C \\tmp\\index.html", pOleObject); break; case WM_PAINT { HDC hdc; PAINTSTRUCT ps; RECT rc; SIZEL sizel; hdc = BeginPaint(hWnd, ps); if (pOleObject) { SetRect( rc, 0, 0, 800, 600); sizel.cx = rc.right - rc.left; sizel.cy = rc.bottom - rc.top; DPtoHIMETRIC( sizel); pOleObject- SetExtent(DVASPECT_CONTENT, sizel); OleDraw(pOleObject, DVASPECT_CONTENT, hdc, rc); } EndPaint(hWnd, ps); } break; case WM_DESTROY if (pOleObject) pOleObject- Release(); CoUninitialize(); PostQuitMessage(0); break; default return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } //------------------------------------------------------------------------------ BOOL GetObjectFromFile(LPWSTR lpszFilePath, IOleObject **ppOleObject) { HRESULT hr; IHTMLDocument2 *pDocument2; IPersistFile *pPersistFile = NULL; BSTR bstrState; hr = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( pDocument2)); if (FAILED(hr)) return FALSE; hr = pDocument2- QueryInterface(IID_PPV_ARGS( pPersistFile)); if (FAILED(hr)) goto Exit; hr = pPersistFile- Load(lpszFilePath, STGM_READ); if (FAILED(hr)) goto Exit;// URLではE_UNEXPECTEDとなる while (1) { Sleep(10); pDocument2- get_readyState( bstrState); if (lstrcmpW(bstrState, L"complete") == 0) { SysFreeString(bstrState); break; } SysFreeString(bstrState); } hr = pDocument2- QueryInterface(IID_PPV_ARGS(ppOleObject)); Exit if (pPersistFile) pPersistFile- Release(); pDocument2- Release(); return SUCCEEDED(hr); } //------------------------------------------------------------------------------ void DPtoHIMETRIC(LPSIZEL lpSizel) { HDC hdc; const int HIMETRIC_INCH = 2540; hdc = GetDC(NULL); lpSizel- cx = MulDiv(lpSizel- cx, HIMETRIC_INCH, GetDeviceCaps(hdc, LOGPIXELSX)); lpSizel- cy = MulDiv(lpSizel- cy, HIMETRIC_INCH, GetDeviceCaps(hdc, LOGPIXELSY)); ReleaseDC(NULL, hdc); }